#include "smg.h"

unsigned char yi, er, san, si, wu, liu, qi, ba;
extern unsigned char uc_SEG_10ms;

//关闭 蜂鸣器继电器LED数码管
void All_Init(void)
{
	P2 = 0xA0;	// 1010 0000
	P0 = 0x00;	//off蜂鸣器继电器
	
	P2 = 0x80;	// 1000 0000
	P0 = 0xFF;	//offLED	
	
	P2 = 0xC0;	//使能锁存器U8 1100 0000
	P0 = 0xFF;	//选择所有数码管
	P2 = 0xE0;	//使能锁存器U7 1111 1111
	P0 = 0xFF;	//关闭所有数码管
}

//15单片机延时函数 @11.0592MHz
void Delay_ms(int xms)
{
	unsigned char i, j;		
	while(xms--){
		_nop_(); _nop_(); _nop_();
		i = 11;	j = 190;
		do{
			while (--j);
		} while (--i);
	}	
}

/*共阳极码表 ABCDEF都是大写*/
							 //0     1     2     3     4     5     6     7     8     9     A     B     C     D     E     F     -    灭
unsigned char NixieTable[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88,0x80, 0xC6, 0xC0, 0x86, 0x8E, 0xBF, 0xFF, \
	0xC0 & 0x7F,  \
	0xF9 & 0x7F,  \
	0xA4 & 0x7F,  \
	0xB0 & 0x7F,  \
	0x99 & 0x7F,  \
	0x92 & 0x7F,  \
	0x82 & 0x7F,  \
	0xF8 & 0x7F,  \
	0x80 & 0x7F,  \
	0x90 & 0x7F,  \
	0xC1,   //U
	0x8C	//P
};
							   
//如果想显示小数点，就 &0x7F 
	
void Nixie(unsigned char location, unsigned char number)
{
	P2 = 0xC0;	//Y6=0;Y6C=1; 使能锁存器U8     P27 = 1; P26 = 1; P25 = 0;
	switch(location)//选中LED位置,位选
	{
		case 1:P0 = 0x01;break;
		case 2:P0 = 0x02;break;
		case 3:P0 = 0x04;break;
		case 4:P0 = 0x08;break;
		case 5:P0 = 0x10;break;
		case 6:P0 = 0x20;break;
		case 7:P0 = 0x40;break;
		case 8:P0 = 0x80;break;
	}
	P2 = 0xE0;	//Y7=0;Y7C=1; 使能锁存器U7     P27 = 1; P26 = 1; P25 = 1;
	P0=NixieTable[number];//数字
	
	Delay_ms(1);P0 = 0xFF;
}


void SMG_8wei_Show(void)
{
	Nixie(1,yi);
	Nixie(2,er);
	Nixie(3,san);
	Nixie(4,si);
	Nixie(5,wu);
	Nixie(6,liu);
	Nixie(7,qi);
	Nixie(8,ba);
	P2 = 0xC0;
	P0 = 0xFF;
	P2 = 0xE0;
}

/*数码管显示浮点数，支持0-1000以内的浮点数*/
void SMG_ShowFloatNum(float num)
{
	
	unsigned char Sep_Num[8]; //一次存放 千百十个...
	long temp;

	if (num >= 0)	//正数
		temp = (long)(num*1000);		
	else	
		temp = (long)(-num*1000);

	
	Sep_Num[0] = temp / 1000000 % 10;	//千位
	Sep_Num[1] = temp / 100000  % 10;	//百位
	Sep_Num[2] = temp / 10000   % 10;	//十位
	Sep_Num[3] = temp / 1000    % 10;	//个位
	Sep_Num[4] = temp / 100     % 10;	//小数点后第一位
	Sep_Num[5] = temp / 10      % 10;	//小数点后第二位
	Sep_Num[6] = temp  	        % 10;	//小数点后第三位	
	
	
	Nixie(4, Sep_Num[3] + 18);	//下标+18代表显示小数点
	Nixie(5, Sep_Num[4]);
	Nixie(6, Sep_Num[5]);
	Nixie(7, Sep_Num[6]);
	
	if 		(num >=10     && num < 100  ) {Nixie(3, Sep_Num[2]);}	//显示十位
	else if (num >=100    && num < 1000 ) {Nixie(3, Sep_Num[2]); Nixie(2, Sep_Num[1]);}	//显示十位百位
	else if (num >=1000   && num <= 9999) {Nixie(3, Sep_Num[2]); Nixie(2, Sep_Num[1]); Nixie(1, Sep_Num[0]);}	//显示十位百位千位
	else if (num > -100   && num <= -10 ) {Nixie(3, Sep_Num[2]); Nixie(2,16);}	//显示十位，并且显示负号
	else if (num > -1000  && num <= -100) {Nixie(3, Sep_Num[2]); Nixie(2, Sep_Num[1]); Nixie(1,16);}	//显示十位百位，并且显示负号
	else if (num >= -9999 && num <=-1000) {Nixie(3, Sep_Num[2]); Nixie(2, Sep_Num[1]); Nixie(1, Sep_Num[0]);}	//显示十位百位千位，但是数码管不够了后续想显示出来，就把数码管显示的内容整体往后挪动一个位置即可
	else if (num > -10    && num < 0    ) {Nixie(3,16);}	//大于-10小于0的负数
}



